# -*- coding: utf-8 -*-
"""
@author: Jiang Ke
@contact: jiangke9413@163.com
@software: PyCharm
@file: RocheGroup.py
@time: 2020/4/14 17:39
"""

import os  # 处理文件和目录
import json  # json 模块来对 JSON 数据进行编解码
from selenium import webdriver  # 用于Web应用程序测试
import time  # 时间
import math  # 浮点数的数学运算函数
from PIL import Image  # 图片处理
from io import BytesIO  # 操作二进制数据


# 获取文件夹
def pages(dirname):  # 每个公众号的路径
    files = os.listdir(dirname)  # 每个公众号里的所有文件
    for i in files:
        filename = i
        if 'idea' in filename:
            continue
        if "Store" in filename:
            continue
        filepath = "%s/%s" % (dirname, filename)  # 获取每个json
        print(filepath)
        content = ""
        with open(filepath) as f:  # 打开并读取每个json
            content = f.read()
        items = json.loads(content)  # 将 JSON 对象转换为 Python 字典
        for list in items["app_msg_list"]:
            aid = list["aid"]
            link = list["link"]
            article_name = "/Users/Shared/罗氏/图文/文章/%s.html" % aid  # 用aid生成每个html

            # 重新下载因网络问题的文章
            if os.path.exists(article_name):  # 判断article_name这个html是否存在
                if os.path.getsize(article_name) > 1024 * 240:  # 如果article_name这个html文件的大小大于1024 * 240继续
                    continue
                else:
                    content = ""
                    with open(article_name) as f:
                        content = f.read()
                        print(content)
                    if "无法访问此网站" not in content:
                        continue

            driver = webdriver.Chrome()  # Chrome浏览器
            driver.set_window_size(width=485, height=1050)  # 浏览器窗口大小
            driver.get(link)  # get请求地址
            print(article_name, link)
            time.sleep(2)  # 延迟时间

            screenshot(driver, aid)  # 截图方法

            driver.quit()  # 浏览器关闭


# 截图
def screenshot(driver, aid):
    page_height = driver.execute_script("return document.body.parentNode.scrollHeight")  # 获取页面的高度
    viewport_height = driver.execute_script("return window.innerHeight")  # 获取可视窗口的高度
    print("页面高度: (%s), 窗口高度: (%s)" % (page_height, viewport_height))

    # 计算切分多少屏
    num = math.ceil(page_height / viewport_height)  # 页面的高度/窗口的高度
    rectangles = []
    for i in range(0, num, 1):  # 切屏次数
        rectangles.append((0, viewport_height * i))  # 每一屏

    screen_shot_list = []  # 每次截图的集合
    total_height = 0  # 全屏高度每次归0
    photo_width = 0  # 每次计算截图的宽归0

    # 开始截图
    for i in range(0, len(rectangles), 1):  # 每一屏
        rectangle = rectangles[i]
        driver.execute_script("window.scrollTo(%s, %s)" % (rectangle[0], rectangle[1]))  # 每一屏的坐标
        pixels = rectangle[1]  # pixels像素 每一屏的高度
        print("下拉滚动条到截屏区域左上角坐标(x=%s,y=%s), 截取第%s屏" % (rectangle[0], rectangle[1], i))
        time.sleep(3)

        # 截取图片
        screenshot = driver.get_screenshot_as_png()  # 截取页面
        screenshot = Image.open(BytesIO(screenshot))  # 把截取到的页面转换为Bytes字节流    Image打开二进制流Byte字节流数据
        photo_width = screenshot.size[0]  # 计算截图的宽高    获取他的宽

        # 最后一张截屏
        if rectangle[1] + viewport_height > page_height:  # 如果最后一屏的高度+窗口高度>页面高度
            # 超出比例
            ratio = (page_height - rectangle[1]) / viewport_height  # （页面的高度 - 最后一屏的高度）/ 窗口的高度  得到超出的比例
            box = (0, (screenshot.size[1] * (1 - ratio)), photo_width, screenshot.size[1])  # 截图的高度*（1-超出的比例）= 超出的真高度
            screenshot = screenshot.crop(box)  # 使用crop（x0,y0,x1,y1）方法对图片做裁切，得到最后一屏的真实宽高

        photo_height = screenshot.size[1]  # 每次截屏的高度
        screen_shot_list.append((screenshot, 0, total_height))  # 每次截图的（截图信息，初始0，截屏高度）
        total_height += photo_height  # 计算全屏高度

        Image.MAX_IMAGE_PIXELS = None  # 最大图像像素
        stitched_image = Image.new('RGB', (photo_width, total_height))  # 重新设置图片的格式和大小
        for screen in screen_shot_list:  # 遍历每次截图的信息
            stitched_image.paste(screen[0], (screen[1], screen[2]))  # 修改每次截图的信息

        ptype = "jpg"  # 默认jpg格式
        if pixels > 65000:  # 如果图片大于65000转为png格式
            ptype = "png"
        # 裁剪图片
        stitched_image = stitched_image.crop((10, 0, stitched_image.size[0] - 20, stitched_image.size[1]))  # 重新设置图片的坐标
        stitched_image_05 = stitched_image.resize(
            (int(stitched_image.size[0] * 0.5), int(stitched_image.size[1] * 0.5)),
            Image.ANTIALIAS)  # 重新设置图片的大小

        stitched_image_05.save("/Users/Shared/罗氏/图文/图片/%s.%s" % (aid, ptype))  # 把图片保存至文件夹

        # 存储html页面
        html = driver.page_source  # 获取浏览器页面
        with open("/Users/Shared/罗氏/图文/文章/%s.html" % aid, "w") as f:
            f.write(html)  # 把页面写入文件夹


# 删除空图或页面
def deleted():
    dirname = "/Users/Shared/罗氏/图文/文章"
    files = os.listdir(dirname)
    for filename in files:
        filepath = "%s/%s" % (dirname, filename)
        # 删除50K以下文件
        if os.path.getsize(filepath) < 1024 * 50:
            print(filepath)
            os.remove("/Users/Shared/罗氏/图文/图片/%s" % (filename.replace(".html", ".jpg")))
            os.remove(filepath)


if __name__ == '__main__':
    rootname = "/Users/Shared/罗氏/文章列表/肺癌/2020-4-10"  # 文件所在路径
    dirs = os.listdir(rootname)  # 获取文件夹下所有目录
    for dirname in dirs:  # 遍历文件夹下所有目录
        if 'idea' in dirname:
            continue  # 取消隐藏文件idea
        if "Store" in dirname:
            continue  # 取消隐藏文件Store
        pages("%s/%s" % (rootname, dirname))  # 文件下所有目录名

    # deleted()
    print('OK')
